package com.web.dao;

import com.web.pojo.domain.Device;
import com.web.pojo.domain.DeviceWorkParameters;
import com.web.pojo.dto.*;
import com.web.pojo.vo.GetSwitchDeviceAttributesVO;
import com.web.pojo.vo.GetSwitchDeviceInfo;
import com.web.pojo.vo.GetSwitchOperatingHours;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Mapper
@Repository
public interface DeviceDao {

    //添加设备
    public Integer insertDevice(Device device);

    //查看设备
    public Device getDevice(String dev_eui);

    /**
     * 检查设备eui是否重复
     * @param deviceEui 设备eui
     * @return 结果
     */
    public Integer checkDeviceEuiUnique(String deviceEui);

    /**
     * 检查设备addr是否重复
     * @param deviceAddr 设备addr
     * @return 结果
     */
    public Integer checkDeviceAddrUnique(String deviceAddr);

    /**
     * 插入用户与设备关联信息
     * @param userId 用户Id
     * @param deviceId 设备Id
     * @return 结果
     */
    public Integer insertUserDevice(@Param("userId") Integer userId, @Param("deviceId") Integer deviceId);

    /**
     * 修改设备信息
     * @param device 设备信息
     * @return 结果
     */
    public Integer updateDevice(Device device);

    /**
     * 删除设备信息
     * @param updateBy 删除者
     * @param deviceIds 设备Id
     * @return 结果
     */
    public Integer deleteDevice(@Param("updateBy") String updateBy, @Param("deviceIds") List<Integer> deviceIds);

    /**
     * 查看设备详情
     * @param deviceId 设备id
     * @return 结果
     */
    public Device selectDeviceDetails(Integer deviceId);

    /**
     * 查看设备列表
     * @param str 查询条件
     * @return 结果
     */
    public List<Device> selectDeviceList(Integer userId, String str);

    /**
     * 根据设备eui查询设备
     * @param deviceEui 设备eui
     * @return 结果
     */
    public Device selectDeviceByDeviceEui(String deviceEui);

    /**
     * 根据地址查询设备
     * @param userId 用户id
     * @param addressId 地址
     * @return 结果
     */
    public List<Device> selectDeviceListByAddressId(@Param("userId") Integer userId,@Param("addressId")Integer addressId);

    /**
     * 设备入网
     * @param deviceId 设备id
     * @param NwkSKey NwkSKey
     * @param AppSKey AppSKey
     * @param gateWayEui 网关Eui
     * @return 结果
     */
    public Integer deviceJoin(@Param("deviceId")Integer deviceId,@Param("NwkSKey")String NwkSKey,@Param("AppSKey")String AppSKey,@Param("gateWayEui")String gateWayEui);

    /**
     * 根据设备addr查询设备
     * @param deviceAddr 设备eui
     * @return 结果
     */
    public Device selectDeviceByDeviceAddr(String deviceAddr);

    /**
     * 根据id列表查询设备信息
     * @param deviceIds
     * @return
     */
    public List<Device> selectDeviceListByIds(List<Integer> deviceIds);


    /**
     * 查询已经入网的设备
     * @param dto 条件
     * @return 结果
     */
    public List<Device> selectRegisteredDeviceByAddressId(SelectRegisteredDeviceDTO dto);

    /**
     * 更新设备开关状态信息
     * @param dto 开关状态
     * @return 结果
     */
    public Integer updateDeviceSwitchState(SetSwitchStateDTO dto);


    /**
     * 更新设备开关控制状态信息
     * @param dto 开关控制状态
     * @return 结果
     */
    public Integer updateDeviceSwitchControlState(SetSwitchControlStateDTO dto);


    /**
     * 更新设备开关调关等级信息
     * @param dto 调关等级信息
     * @return 结果
     */
    public Integer updateDeviceSwitchDimmingLevel(SetSwitchDimmingLevelDTO dto);

    /**
     * 更新设备上报周期信息
     * @param dto 上报周期信息
     * @return 结果
     */
    public Integer updateDeviceSwitchReportingPeriod(SetSwitchReportingPeriodDTO dto);

    /**
     * 更新设备开关的温度、湿度、露点、电源/电量、设备状态
     * @param getSwitchDeviceStatusVO 属性信息
     * @return 结果
     */
    public Integer updateDeviceSwitchAttributes(GetSwitchDeviceAttributesVO getSwitchDeviceStatusVO);

    /**
     * 更新设备开关的温度、湿度、露点、电源/电量、设备状态
     * @param getSwitchDeviceStatusVO 属性信息
     * @return 结果
     */
    public Integer updateDeviceSwitchOperatingHours(GetSwitchOperatingHours getSwitchDeviceStatusVO);

    /**
     * 添加/修改开关时间表
     * @param dto 时间表信息
     * @return 结果
     */
    public Integer replaceDeviceSwitchSchedule(SetSwitchScheduleDTO dto);


    /**
     * 查看设备工作参数
     * @param deviceId 设备id
     * @return 结果
     */
    public DeviceWorkParameters selectDeviceWorkParameters(Integer deviceId);

    /**
     * 添加设备工作参数默认值
     * @param deviceId
     * @return
     */
    public Integer insertDeviceWorkParameters(Integer deviceId);

    /**
     * 设备授权
     * @param ids 授权的Id
     * @param userId 用户id
     * @return 结果
     */
    public Integer authorizeDevice(List<Integer> ids, Integer userId);

    /**
     * 更新设备APPKEY
     * @param deviceId
     * @param appKey
     * @return
     */
    public Integer updateDeviceAppkey(Integer deviceId,String appKey);

    /**
     * 更新设备类型、初始化上行通道、版本号
     * @param getSwitchDeviceInfo
     * @return
     */
    public Integer updateDeviceSwitchDeviceInfo(GetSwitchDeviceInfo getSwitchDeviceInfo);

}
